#!/usr/bin/env python3
# -*- coding: utf-8 -*-
"""
音视频分离工具打包脚本
使用 PyInstaller 创建独立的可执行文件
"""

import os
import sys
import subprocess
import shutil
from pathlib import Path

def check_pyinstaller():
    """检查 PyInstaller 是否已安装"""
    try:
        import PyInstaller
        print("✓ PyInstaller 已安装")
        return True
    except ImportError:
        print("✗ PyInstaller 未安装")
        return False

def install_pyinstaller():
    """安装 PyInstaller"""
    print("正在安装 PyInstaller...")
    try:
        subprocess.check_call([sys.executable, "-m", "pip", "install", "pyinstaller"])
        print("✓ PyInstaller 安装成功")
        return True
    except subprocess.CalledProcessError:
        print("✗ PyInstaller 安装失败")
        return False

def create_spec_file():
    """创建 PyInstaller 配置文件"""
    spec_content = '''# -*- mode: python ; coding: utf-8 -*-

block_cipher = None

a = Analysis(
    ['main.py'],
    pathex=[],
    binaries=[],
    datas=[],
    hiddenimports=[
        'tkinter',
        'tkinter.ttk',
        'tkinter.filedialog',
        'tkinter.messagebox',
        'ffmpeg',
        'aiofiles',
        'asyncio',
        'multiprocessing',
        'queue',
        'json',
        'hashlib',
        'mimetypes',
        'datetime',
        'time',
        'os',
        'sys',
        'pathlib'
    ],
    hookspath=[],
    hooksconfig={},
    runtime_hooks=[],
    excludes=[],
    win_no_prefer_redirects=False,
    win_private_assemblies=False,
    cipher=block_cipher,
    noarchive=False,
)

pyz = PYZ(a.pure, a.zipped_data, cipher=block_cipher)

exe = EXE(
    pyz,
    a.scripts,
    a.binaries,
    a.zipfiles,
    a.datas,
    [],
    name='音视频分离工具',
    debug=False,
    bootloader_ignore_signals=False,
    strip=False,
    upx=True,
    upx_exclude=[],
    runtime_tmpdir=None,
    console=False,
    disable_windowed_traceback=False,
    argv_emulation=False,
    target_arch=None,
    codesign_identity=None,
    entitlements_file=None,
    icon=None,
)
'''
    
    with open('video_processor.spec', 'w', encoding='utf-8') as f:
        f.write(spec_content)
    
    print("✓ 配置文件创建成功")

def build_executable():
    """构建可执行文件"""
    print("开始构建可执行文件...")
    
    try:
        # 使用 spec 文件构建
        cmd = [
            'pyinstaller',
            '--clean',
            'video_processor.spec'
        ]
        
        result = subprocess.run(cmd, capture_output=True, text=True)
        
        if result.returncode == 0:
            print("✓ 构建成功！")
            return True
        else:
            print(f"✗ 构建失败: {result.stderr}")
            return False
            
    except Exception as e:
        print(f"✗ 构建过程中出错: {e}")
        return False

def create_installer():
    """创建安装包"""
    print("创建安装包...")
    
    # 创建发布目录
    dist_dir = Path("dist")
    if dist_dir.exists():
        shutil.rmtree(dist_dir)
    
    # 创建安装包目录
    installer_dir = Path("installer")
    if installer_dir.exists():
        shutil.rmtree(installer_dir)
    installer_dir.mkdir()
    
    # 复制可执行文件
    exe_path = Path("dist/音视频分离工具.exe")
    if exe_path.exists():
        shutil.copy2(exe_path, installer_dir / "音视频分离工具.exe")
        print("✓ 可执行文件复制成功")
    else:
        print(f"✗ 可执行文件不存在: {exe_path.absolute()}")
        return False
    
    # 复制 FFmpeg
    try:
        # 使用 PowerShell 获取 FFmpeg 路径
        cmd = ['powershell', '-Command', '(Get-Command ffmpeg).Path']
        result = subprocess.run(cmd, capture_output=True, text=True)
        
        if result.returncode == 0:
            ffmpeg_path = result.stdout.strip()
            if ffmpeg_path and os.path.exists(ffmpeg_path):
                # 创建 ffmpeg 目录
                ffmpeg_dir = installer_dir / "ffmpeg"
                ffmpeg_dir.mkdir(exist_ok=True)
                
                # 复制 ffmpeg.exe
                shutil.copy2(ffmpeg_path, ffmpeg_dir / "ffmpeg.exe")
                print("✓ FFmpeg 复制成功")
                
                # 复制 ffprobe.exe（如果存在）
                ffprobe_path = ffmpeg_path.replace("ffmpeg.exe", "ffprobe.exe")
                if os.path.exists(ffprobe_path):
                    shutil.copy2(ffprobe_path, ffmpeg_dir / "ffprobe.exe")
                    print("✓ FFprobe 复制成功")
            else:
                print("⚠ FFmpeg 路径无效，跳过复制")
        else:
            print("⚠ 无法获取 FFmpeg 路径，跳过复制")
    except Exception as e:
        print(f"⚠ 复制 FFmpeg 时出错: {e}")
    
    # 创建说明文件
    readme_content = """音视频分离工具

使用说明：
1. 双击运行"音视频分离工具.exe"
2. 选择包含视频文件的输入文件夹
3. 选择输出文件夹
4. 配置处理选项（保存音频/视频/字幕，字幕处理等）
5. 点击"开始处理"

注意事项：
- 本安装包已包含 FFmpeg，无需单独安装
- 如果系统已安装 FFmpeg，程序会优先使用系统版本
- 如需手动安装 FFmpeg，下载地址：https://ffmpeg.org/download.html

功能特点：
- 支持多种视频格式（MP4, AVI, MOV, MKV等）
- 音视频分离
- 字幕提取和移除
- 分辨率调整
- 并行处理，提高效率
- 友好的图形界面

如有问题，请检查：
1. FFmpeg 是否正确安装
2. 输入文件夹是否包含支持的视频文件
3. 输出文件夹是否有写入权限
"""
    
    with open(installer_dir / "使用说明.txt", 'w', encoding='utf-8') as f:
        f.write(readme_content)
    
    print("✓ 说明文件创建成功")
    
    # 创建批处理文件（用于检查FFmpeg）
    batch_content = """@echo off
echo 检查 FFmpeg 状态...

REM 首先检查是否有打包的 FFmpeg
if exist "ffmpeg\\ffmpeg.exe" (
    echo 使用打包的 FFmpeg
    set PATH=%~dp0ffmpeg;%PATH%
    goto :start_app
)

REM 检查系统是否安装了 FFmpeg
ffmpeg -version >nul 2>&1
if %errorlevel% == 0 (
    echo 使用系统安装的 FFmpeg
    goto :start_app
) else (
    echo FFmpeg 未找到
    echo 请确保 ffmpeg 目录存在或系统已安装 FFmpeg
    pause
    exit /b 1
)

:start_app
echo 正在启动音视频分离工具...
start "" "音视频分离工具.exe"
"""
    
    with open(installer_dir / "启动程序.bat", 'w', encoding='gbk') as f:
        f.write(batch_content)
    
    print("✓ 启动脚本创建成功")
    
    return True

def main():
    """主函数"""
    print("=" * 50)
    print("音视频分离工具打包程序")
    print("=" * 50)
    
    # 检查当前目录
    if not os.path.exists("main.py"):
        print("✗ 请在项目根目录运行此脚本")
        return
    
    # 检查 PyInstaller
    if not check_pyinstaller():
        if not install_pyinstaller():
            return
    
    # 创建配置文件
    create_spec_file()
    
    # 构建可执行文件
    if not build_executable():
        return
    
    # 创建安装包
    if create_installer():
        print("\n" + "=" * 50)
        print("打包完成！")
        print("=" * 50)
        print("可执行文件位置: dist/音视频分离工具.exe")
        print("安装包位置: installer/")
        print("\n安装包包含：")
        print("- 音视频分离工具.exe (主程序)")
        print("- 使用说明.txt (使用说明)")
        print("- 启动程序.bat (启动脚本)")
        print("\n注意：目标电脑需要安装 FFmpeg")
    else:
        print("✗ 创建安装包失败")

if __name__ == "__main__":
    main() 